package com.atguigu.spzx.cloud.gateway.filter;

import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.stereotype.Component;
import org.springframework.util.AntPathMatcher;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

/*
    创建一个网关过滤器：
          过滤所有的请求，统计访问order和user服务的请求数....

          1、全局过滤器   实现GlobalFilter接口
            创建后默认会过滤所有的请求

            全局过滤器主要用来  统计、限流、黑名单白名单检查、登录状态校验
          2、局部过滤器
            需要在配置文件中给指定路由配置才会生效
            > 验证请求头中包含token的放行  否则拒绝请求 并响应一个Result对象的json字符串到响应体中
        当访问网关的请求被路由匹配后 过滤器才会生效

 */
@Component
public class GlobalStatisticsGatewayFilter implements GlobalFilter {
    private int orderCount = 0;
    private  int userCount = 0;
    //过滤方法
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        System.out.println("请求进入GlobalStatisticsGatewayFilter...");
        //1、通过交换机对象获取请求对象
        ServerHttpRequest request = exchange.getRequest();
        //2、获取请求资源路径
        String path = request.getURI().getPath();
        //3、区分资源路径访问的是哪个服务
        //ant风格url匹配工具
        AntPathMatcher antPathMatcher = new AntPathMatcher();
        boolean orderMatch = antPathMatcher.match("/*/order/**", path);
        boolean userMatch = antPathMatcher.match("/*/user/**", path);
        boolean user2Match = antPathMatcher.match("/user/param/**", path);
        if(orderMatch){
            orderCount++;
            System.out.println("订单服务请求数："+orderCount);
        }else if(userMatch || user2Match){
            userCount++;
            System.out.println("用户服务请求数："+userCount);
        }

        //4、放行请求
        return chain.filter(exchange);
    }
}
